home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / has060 / hassrc87.lzh / error.s < prev    next >
Text File  |  1999-10-08  |  14KB  |  423 lines

  1. ;----------------------------------------------------------------
  2. ;    X68k High-speed Assembler
  3. ;        エラー・ワーニング処理
  4. ;        < error.s >
  5. ;
  6. ;    $Id: error.s,v 2.3  1999 10/ 8(Fri) 21:04:21 M.Kamada Exp $
  7. ;
  8. ;        Copyright 1990-94  by Y.Nakamura
  9. ;                  1997-99  by M.Kamada
  10. ;----------------------------------------------------------------
  11.  
  12.     .include    DOSCALL.MAC
  13.     .include    has.equ
  14.     .include    tmpcode.equ
  15.     .include    symbol.equ
  16.  
  17.     .cpu    68000
  18.     .text
  19.  
  20.  
  21. ;----------------------------------------------------------------
  22. ;    エラー・ワーニング処理ルーチン
  23. ;----------------------------------------------------------------
  24.  
  25. ;----------------------------------------------------------------
  26. ;    ワーニング処理ルーチン
  27. ;----------------------------------------------------------------
  28.  
  29. warntbl    .macro
  30.     warn    1,4,abswarn,        '絶対アドレッシングです'
  31.     warn    1,4,absshwarn,        '絶対ショートアドレッシングです'
  32.     warn    1,3,shortwarn,        'アドレスレジスタを %s.w で更新しています'
  33.     warn    1,3,shortwarn_cmpa,    'アドレスレジスタを %s.w で比較しています'
  34.     warn    1,3,shvalwarn_absw,    '絶対ショートアドレスが -$8000~$7FFF の範囲外です'
  35.     warn    1,3,shvalwarn_d16,    'オフセットが -32768~32767 の範囲外です'
  36.     warn    1,3,shvalwarn_d8,    'オフセットが -128~127 の範囲外です'
  37.     warn    1,1,reglwarn,        'レジスタリストの表記が不正です'
  38.     warn    1,1,alignwarn,        '%s のデータのアラインメントが不正です'
  39.     warn    1,1,alignwarn_op,    '命令が奇数アドレスに配置されました'
  40.     warn    1,1,softwarn,        '%s はソフトウェアエミュレーションで実行されます'
  41.     warn    1,1,f43gwarn,        '浮動小数点命令の直後に NOP を挿入しました (エラッタ対策)'
  42.     warn    1,1,movetouspwarn,    'MOVE to USP の直前に MOVEA.L A0,A0 を挿入しました (エラッタ対策)'
  43.     warn    1,1,insigbitwarn,    'CCR/SR の未定義のビットを操作しています'
  44.     warn    1,1,indexszwarn,    'インデックスのサイズが指定されていません'
  45.     warn    1,1,redefwarn_set,    'シンボル %s を .set(=) で上書きしました'
  46.     warn    1,1,redefwarn_offsym,    'シンボル %s を .offsym で上書きしました'
  47.     warn    1,1,ds_negative_warn,    '%s の引数が負数です'
  48.  
  49.     .endm
  50.  
  51. warn    .macro    cnt,lvl,lab,str
  52. lab::
  53.   .if cnt+0
  54.     movem.l    d0-d1,-(sp)
  55.     moveq.l    #n,d0
  56. n = n+(cnt+0)
  57.     moveq.l    #lvl,d1
  58.     bra    warnout
  59.   .endif
  60.     .endm
  61.  
  62. n = 0
  63.     warntbl
  64.  
  65. warnout:
  66.     cmp.b    (WARNLEVEL,a6),d1
  67.     bhi    warnout9
  68. warnout1:
  69.     movem.l    d3/a0-a2,-(sp)
  70.     add.w    d0,d0            ;ワーニング番号×2
  71.     move.w    (warn_msg_tbl,pc,d0.w),d0
  72.     lea.l    (warn_msg_tbl,pc,d0.w),a2
  73.     move.l    (ERRMESSYM,a6),d3
  74.     moveq.l    #0,d1
  75.     bsr    printerr
  76.     cmpi.b    #3,(ASMPASS,a6)
  77.     bne    warnout2
  78.     tst.b    (MAKEPRN,a6)
  79.     beq    warnout8
  80. warnout2:                ;パス1/パス3でPRNファイルを作成する場合は
  81.     move.w    #STDOUT,-(sp)
  82.     pea.l    (LINEBUF,a6)        ;行の内容も表示する
  83.     DOS    _FPUTS
  84.     pea.l    (crlf_msg,pc)
  85.     DOS    _PRINT
  86.     lea.l    (10,sp),sp
  87. warnout8:
  88.     movem.l    (sp)+,d3/a0-a2
  89. warnout9:
  90.     movem.l    (sp)+,d0-d1
  91. warnout99:
  92.     rts
  93.  
  94. warn    .macro    cnt,lvl,lab,str
  95.   .if cnt+0
  96.     .dc.w    m_&lab-warn_msg_tbl
  97.   .endif
  98.     .endm
  99.  
  100. warn_msg_tbl:
  101.     warntbl
  102.  
  103. warn    .macro    cnt,lvl,lab,str
  104.   .if cnt+0
  105. m_&lab:
  106.     mes    str
  107.     .dc.b    0
  108.   .endif
  109.     .endm
  110.  
  111.     warntbl
  112.     .even
  113.  
  114.  
  115. ;----------------------------------------------------------------
  116. ;    エラー処理ルーチン
  117. ;----------------------------------------------------------------
  118.  
  119. errtbl    .macro
  120.     error    1,forcederr,        '.fail によるエラー'
  121.     error    1,redeferr,        'シンボル %s は既に定義されています'
  122.     error    1,redeferr_predefine,    'プレデファインシンボル %s を再定義しようとしました'
  123.     error    1,redeferr_set,        'シンボル %s は .set(=) 以外で定義されています'
  124.     error    1,redeferr_offsym,    'シンボル %s は .offsym 以外で定義されています'
  125.     error    1,badopeerr,        '命令が解釈できません'
  126.     error    1,badopeerr_local,    'ローカルラベルの記述が不正です'
  127.     error    0,ilsymerr_value
  128.     error    0,ilsymerr_local
  129.     error    0,ilsymerr_real
  130.     error    1,ilsymerr_regsym,    'シンボル %s は種類が異なるので使えません'
  131.     error    1,ilsymerr_register,    'シンボル %s はレジスタ名なので使えません'
  132.     error    1,ilsymerr_predefxdef,    'プレデファインシンボル %s は外部定義宣言できません'
  133.     error    1,ilsymerr_predefxref,    'プレデファインシンボル %s は外部参照宣言できません'
  134.     error    1,ilsymerr_predefglobl,    'プレデファインシンボル %s はグローバル宣言できません'
  135.     error    1,ilsymerr_lookfor,    'シンボル %s の定義が参照方法と矛盾しています'
  136.     error    1,exprerr,        '記述が間違っています'
  137.     error    1,exprerr_ea,        '実効アドレスが解釈できません'
  138.     error    1,exprerr_cannotscale,    'スケールファクタは指定できません'
  139.     error    1,exprerr_scalefactor,    'スケールファクタの指定が間違っています'
  140.     error    1,exprerr_fullformat,    'フルフォーマットのアドレッシングは使えません'
  141.     error    1,exprerr_immediate,    'イミディエイトデータが解釈できません'
  142.     error    1,regerr,        '指定できないレジスタです'
  143.     error    1,regerr_opc,        'このアドレッシングでは opc は使えません'
  144.     error    1,iladrerr,        '指定できないアドレッシングです'
  145.     error    0,ilsizeerr_op        ;'命令 %s には指定できないサイズです'
  146.     error    0,ilsizeerr_pseudo    ;'疑似命令 %s には指定できないサイズです'
  147.     error    0,ilsizeerr_moveusp    ;'MOVE USP はロングワードサイズのみ指定可能です'
  148.     error    0,ilsizeerr_cf_acc    ;'MOVE ACC はロングワードサイズのみ指定可能です'
  149.     error    0,ilsizeerr_fpn        ;'浮動小数点レジスタ直接アドレッシングは拡張サイズのみ指定可能です'
  150.     error    0,ilsizeerr_fprn    ;'汎用レジスタ直接アドレッシングはロングワードサイズのみ指定可能です'
  151.     error    0,ilsizeerr_fpcr    ;'FPCR/FPIAR/FPSR はロングワードサイズのみ指定可能です'
  152.     error    0,ilsizeerr_fmovemfpn    ;'FMOVEM FPn は拡張サイズのみ指定可能です'
  153.     error    0,ilsizeerr_fmovemfpcr    ;'FMOVEM FPcr はロングワードサイズのみ指定可能です'
  154.     error    0,ilsizeerr_cf_long    ;'5200/5300 ではロングワードサイズのみ指定可能です'
  155.     error    0,ilsizeerr_cf_bccl    ;'5200/5300 ではロングワードサイズの相対分岐はできません'
  156.     error    1,ilsizeerr,        '指定できないサイズです'
  157.     error    0,ilsizeerr_pseudo_no
  158.     error    1,ilsizeerr_op_no,    '%s にはサイズを指定できません'
  159.     error    1,ilsizeerr_ccr,    '%s to CCR はバイトサイズのみ指定可能です'
  160.     error    1,ilsizeerr_sr,        '%s to SR はワードサイズのみ指定可能です'
  161.     error    1,ilsizeerr_an,        'アドレスレジスタはバイトサイズでアクセスできません'
  162.     error    1,ilsizeerr_movetosr,    'MOVE to CCR/SR はワードサイズのみ指定可能です'
  163.     error    1,ilsizeerr_movefrsr,    'MOVE from CCR/SR はワードサイズのみ指定可能です'
  164.     error    1,ilsizeerr_000_long,    '68000/68010 ではロングワードサイズは指定できません'
  165.     error    1,ilsizeerr_sftrotmem,    'メモリに対するシフト・ローテートはワードサイズのみ指定可能です'
  166.     error    1,ilsizeerr_bitmem,    'メモリに対するビット操作はバイトサイズのみ指定可能です'
  167.     error    1,ilsizeerr_bitreg,    'データレジスタに対するビット操作はロングワードサイズのみ指定可能です'
  168.     error    1,ilsizeerr_000_bccl,    '68000/68010 ではロングワードサイズの相対分岐はできません'
  169.     error    1,ilsizeerr_trapcc,    'オペランドのない TRAPcc にはサイズを指定できません'
  170.     error    1,iloprerr,        '不正なオペランドです'
  171.     error    1,iloprerr_not_fixed,    '引数が確定していません'
  172.     error    1,iloprerr_too_many,    '%s のオペランドが多すぎます'
  173.     error    1,iloprerr_pseudo_many,    '%s の引数が多すぎます'
  174.     error    1,iloprerr_local,    'ローカルラベルの参照が不正です'
  175.     error    1,iloprerr_ds_negative,    '%s の引数が負数です'
  176.     error    1,iloprerr_end_xref,    '.end に外部参照値は指定できません'
  177.     error    1,undefsymerr,        'シンボル %s が未定義です'
  178.     error    1,undefsymerr_local,    'ローカルラベルが未定義です'
  179.     error    1,undefsymerr_offsym,    '値を確定できません'
  180.     error    1,divzeroerr,        '0 で除算しました'
  181.     error    1,ilrelerr_outside,    'オフセットが範囲外です'
  182.     error    1,ilrelerr_const,    '定数ではなくアドレス値が必要です'
  183.     error    1,overflowerr,        'オーバーフローしました'
  184.     error    1,ilvalueerr,        '不正な値です'
  185.     error    1,ilquickerr_addsubq,    'データが 1~8 の範囲外です'
  186.     error    1,ilquickerr_moveq,    'データが -128~127 の範囲外です'
  187.     error    1,ilquickerr_mov3q,    'データが -1,1~7 の範囲外です'
  188.     error    0,ilquickerr_sftrot
  189.     error    1,ilsfterr,        'シフト・ローテートのカウントが 1~8 の範囲外です'
  190.     error    1,featureerr_cpu,    '未対応の cpu です'
  191.     error    1,featureerr_xref,    '外部参照値の埋め込みはできません'
  192.     error    1,nosymerr_macro,    'マクロ名がありません'
  193.     error    1,nosymerr_pseudo,    '%s で定義するシンボルがありません'
  194.     error    1,tooinclderr,        '.include のネストが深すぎます'
  195.     error    1,nofileerr,        '%s するファイルが見つかりません'
  196.     error    1,mismacerr_exitm,    'マクロ展開中ではないのに %s があります'
  197.     error    0,mismacerr_endm
  198.     error    0,mismacerr_local
  199.     error    1,mismacerr_sizem,    'マクロ定義中ではないのに %s があります'
  200.     error    1,mismacerr_eof,    '.endm が足りません'
  201.     error    1,toomanylocsymerr,    '1 つのマクロの中のローカルシンボルが多すぎます'
  202.     error    1,macnesterr,        'マクロのネストが深すぎます'
  203.     error    0,misiferr_else
  204.     error    0,misiferr_elseif
  205.     error    1,misiferr_endif,    '%s に対応する .if がありません'
  206.     error    1,misiferr_else_elseif,    '.else の後に .elseif があります'
  207.     error    1,misiferr_eof,        '.endif が足りません'
  208.     error    1,termerr_doublequote,    '"~"が閉じていません'
  209.     error    1,termerr_singlequote,    "'~'が閉じていません"
  210.     error    1,termerr_bracket,    '<~>が閉じていません'
  211.     error    1,ilinterr,        '整数の記述が間違っています'
  212.     error    1,offsymalignerr,    '.offsym 中に %s は指定できません'
  213.     .endm
  214.  
  215. error    .macro    cnt,lab,str
  216. lab::
  217.   .if cnt+0
  218.     moveq.l    #n,d0
  219. n = n+(cnt+0)
  220.     bra    errout
  221.   .endif
  222.     .endm
  223.  
  224. n = 0
  225.     errtbl
  226.  
  227. errout::
  228.     move.l    (ERRMESSYM,a6),d3
  229. errout_d3::
  230.     cmpi.b    #3,(ASMPASS,a6)
  231.     beq    errout9            ;パス3以外ではエラーメッセージを出力しない
  232.     or.w    #T_ERROR,d0        ;T_ERROR|エラー番号
  233.     bsrl    wrtobjd0w,d2        ;ファイルにエラーコードを出力
  234.     move.w    (ERRMESSYM+0,a6),d0
  235.     bsrl    wrtobjd0w,d2        ;エラーメッセージに埋め込むシンボル
  236.     move.w    (ERRMESSYM+2,a6),d0
  237.     bsrl    wrtobjd0w,d2
  238.     bra    errout91        ;パス3ではテンポラリコードを出力する必要はない
  239.  
  240. errout9:
  241.     add.w    d0,d0            ;エラー番号×2
  242.     move.w    (err_msg_tbl,pc,d0.w),d0
  243.     lea.l    (err_msg_tbl,pc,d0.w),a2
  244.     moveq.l    #1,d1
  245.     bsr    printerr
  246. errout91:
  247.     addq.w    #1,(NUMOFERR,a6)
  248.     movea.l    (SPSAVE,a6),sp
  249.     move.l    (ERRRET,a6),-(sp)
  250.     rts                ;エラー処理から復帰
  251.  
  252. error    .macro    cnt,lab,str
  253.   .if cnt+0
  254.     .dc.w    m_&lab-err_msg_tbl
  255.   .endif
  256.     .endm
  257.  
  258. err_msg_tbl:
  259.     errtbl
  260.  
  261. error    .macro    cnt,lab,str
  262.   .if cnt+0
  263. m_&lab:
  264.     .dc.b    str,0
  265.   .endif
  266.     .endm
  267.  
  268.     errtbl
  269.     .even
  270.  
  271. ;----------------------------------------------------------------
  272. ;    エラー・ワーニングメッセージを出力する
  273. ;<d1.w:0='Warning',1='Error'
  274. ;<d3.l:(ERRMESSYM,a6),%sがあるメッセージではd3=0は不可
  275. ;<a2.l:メッセージ文字列へのポインタ
  276. printerr:
  277.     link    a5,#-128
  278.     movem.l    d0/d3/a0-a1,-(sp)
  279.     lea.l    (-128,a5),a0
  280.     movea.l    (INPFILE,a6),a1        ;ファイル名へのポインタ
  281.     moveq.l    #16,d0
  282. printerr1:
  283.     subq.w    #1,d0
  284.     move.b    (a1)+,(a0)+        ;ファイル名を転送
  285.     bne    printerr1
  286.     subq.l    #1,a0
  287.     tst.w    d0
  288.     bmi    printerr3
  289. printerr2:
  290.     move.b    #' ',(a0)+        ;余りをスペースで埋める
  291.     dbra    d0,printerr2
  292. printerr3:
  293.     move.b    #' ',(a0)+
  294.     move.w    d1,-(sp)
  295.     move.l    (LINENUM,a6),d0
  296.     moveq.l    #5,d1            ;(5桁でゼロサプレス)
  297.     cmp.l    #100000,d0
  298.     bcs    printerr4
  299.     moveq.l    #0,d1            ;6桁以上になるなら左詰め
  300. printerr4:
  301.     move.l    d2,-(sp)
  302.     bsrl    convdec,d2        ;行番号
  303.     move.l    (sp)+,d2
  304.     move.w    (sp)+,d1
  305.     lea.l    (warn_msg,pc),a1
  306.     tst.w    d1
  307.     beq    printerr5
  308.     lea.l    (error_msg,pc),a1
  309. printerr5:
  310.     bsr    strcpy
  311.     movea.l    a2,a1
  312.     bra    printerr51
  313.  
  314. printerr50:
  315.     move.b    d0,(a0)+
  316. printerr51:
  317.     move.b    (a1)+,d0
  318.     beq    printerr53
  319.     cmp.b    #'%',d0
  320.     bne    printerr50
  321.     cmpi.b    #'s',(a1)
  322.     bne    printerr50
  323.     addq.l    #1,a1
  324.     exg.l    d3,a1
  325.     cmpi.b    #ST_OPCODE,(SYM_TYPE,a1)
  326.     bne    printerr52        ;命令でない
  327.     tst.w    (SYM_ARCH,a1)
  328.     bne    printerr52        ;疑似命令でない
  329.     move.b    #'.',(a0)+        ;疑似命令の先頭に'.'を付ける
  330. printerr52:
  331.     movea.l    (SYM_NAME,a1),a1
  332.     bsr    strcpy
  333.     movea.l    d3,a1
  334.     bra    printerr51
  335.  
  336. printerr53:
  337.   .if UNIX_NEWLINE=0
  338.     move.b    #CR,(a0)+
  339.   .endif
  340.     move.b    #LF,(a0)+
  341.     clr.b    (a0)
  342. printerr6:
  343.     lea.l    (-128,a5),a0
  344.     bsrl    prnstdout,d0        ;標準出力・PRNファイルにエラーメッセージを表示
  345.     movem.l    (sp)+,d0/d3/a0-a1
  346.     unlk    a5
  347.     rts
  348.  
  349. strcpy:
  350.     move.b    (a1)+,(a0)+
  351.     bne    strcpy
  352.     subq.l    #1,a0
  353.     rts
  354.  
  355. ;----------------------------------------------------------------
  356. ;    エラー・ワーニングメッセージ
  357. warn_msg:    .dc.b    ': Warning: ',0
  358. error_msg:    .dc.b    ': Error: ',0
  359.  
  360. crlf_msg::    .dc.b    CRLF,0
  361.     .even
  362.  
  363.  
  364. ;----------------------------------------------------------------
  365.     .end
  366.  
  367. ;----------------------------------------------------------------
  368. ;    $Log: error.s,v $
  369. ;    Revision 2.3  1999 10/ 8(Fri) 21:04:21 M.Kamada
  370. ;    +86 ilsymerrを細分化
  371. ;    +86 ilsizeerrを細分化
  372. ;    +86 改行コードの変更に対応
  373. ;    +86 EUC対応準備
  374. ;    +86 '%s に外部参照値は指定できません'
  375. ;    +86 foo fequ fooのエラーメッセージがおかしい
  376. ;
  377. ;    Revision 2.2  1999  6/ 9(Wed) 23:37:52 M.Kamada
  378. ;    +85 .offsymでシンボル指定があるとき.even/.quad/.alignをエラーにする
  379. ;    +85 .dsの引数が負数のとき.text/.dataセクションではエラー,その他はワーニング
  380. ;
  381. ;    Revision 2.1  1999  4/24(Sat) 03:14:35 M.Kamada
  382. ;    +84 マクロ内のローカルシンボルが多すぎるとバスエラーが出る不具合を修正
  383. ;
  384. ;    Revision 2.0  1999  3/16(Tue) 03:46:21 M.Kamada
  385. ;    +83 エラーメッセージ中の疑似命令の先頭に'.'を付ける
  386. ;    +83 「ローカルラベルの参照が不正です」を追加
  387. ;
  388. ;    Revision 1.9  1999  3/ 6(Sat) 21:50:58 M.Kamada
  389. ;    +82 エラーメッセージを日本語化
  390. ;    +82 疑似命令のパラメータが多すぎる場合のエラーチェックを強化
  391. ;    +82 error.sの構造を変更
  392. ;
  393. ;    Revision 1.8  1999  2/27(Sat) 23:39:49 M.Kamada
  394. ;    +81 ソースリストのフォーマットを変更(実行ファイルは+80とまったく同じ)
  395. ;
  396. ;    Revision 1.7  1998  3/30(Mon) 21:37:41 M.Kamada
  397. ;    +61 warning: insignificant bitを追加
  398. ;
  399. ;    Revision 1.6  1998  1/10(Sat) 15:44:52 M.Kamada
  400. ;    +56 MOVE to USPのエラッタを回避
  401. ;
  402. ;    Revision 1.5  1997 10/29(Wed) 21:51:23 M.Kamada
  403. ;    +52 記述された整数が64bitを超えたらエラー
  404. ;    +52 misc.sの相対呼び出しをロングに
  405. ;    +52 strcpyを内蔵
  406. ;
  407. ;    Revision 1.4  1997  9/14(Sun) 16:25:55 M.Kamada
  408. ;    +46 error.sを分離
  409. ;
  410. ;    Revision 1.3  1997  3/20(Thu) 15:52:18 M.Kamada
  411. ;    +23 terminator not foundをエラーに
  412. ;
  413. ;    Revision 1.2  1996 12/15(Sun) 14:13:22 M.Kamada
  414. ;    +02 68060対応
  415. ;        ソフトウェアエミュレーションのワーニングを追加
  416. ;    +07 F43G対策
  417. ;        F43G対策のワーニングを追加
  418. ;
  419. ;    Revision 1.1  1994/02/13  14:10:18  nakamura
  420. ;    Initial revision
  421. ;
  422. ;
  423.